package com.zhongchaowuye.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;

public class Tools {
	/**
	 * 作用：将Timestamp类型转换为"yyyy-MM-dd HH:mm:ss"的字符串格式
	 * 参数：Timestamp类型的ts
	 * 更新时间：2024-12-25
	 */
    public static String TimestampToString(Timestamp ts){
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    	return sdf.format(ts);
    }

	/**
	 * 作用：已知年月，获取这个月的天数
	 * 参数：字符串类型的年与月，其中月份是2位的格式
	 * 更新时间：2024-12-25
	 */
    public static String daysInMonth(String y,String m) throws Exception{
    	int yyyy=Integer.parseInt(y);
    	int mm=Integer.parseInt(m);
    	// 使用YearMonth类来创建一个表示特定年月的对象
        YearMonth yearMonth=YearMonth.of(yyyy,mm);
 
        // 使用lengthOfMonth方法获取这个月的天数
        int daysInMonth=yearMonth.lengthOfMonth();
        return Integer.toString(daysInMonth);
    }

	/**
	 * 作用：获取下一个月的第一天
	 * 参数：字符串类型的年月日（格式为：yyyy-MM-dd）
	 * 更新时间：2024-12-25
	 */
    public static String nextMonthFirstDay(String ymd) throws Exception{
        DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd"); //定义日期格式
        LocalDate specifiedDate=LocalDate.parse(ymd,fmt); //解析参数日期字符串为LocalDate对象
        //计算下个月的同一天，然后使用 withDayOfMonth(1) 方法获取下个月的第一天
        LocalDate nextMonthFirstDay=specifiedDate.plusMonths(1).withDayOfMonth(1);
        return nextMonthFirstDay+" 00:00:00";
    }
    
	/**
	 * 作用：获取当前月的最后一天
	 * 参数：字符串类型的年月日（格式为：yyyy-MM-dd）
	 * 更新时间：2024-12-26
	 */
    public static String lastDayOfMonth(String ymd) throws Exception{
        DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd"); //定义日期格式
        LocalDate specifiedDate=LocalDate.parse(ymd,fmt); //解析参数日期字符串为LocalDate对象
        
        YearMonth currentYearMonth=YearMonth.from(specifiedDate);
        LocalDate lastDay=currentYearMonth.atEndOfMonth();
        return lastDay+" 23:59:59";
    }

	/**
	 * 作用：获取当前月的天数
	 * 参数：字符串类型的年月日（格式为：yyyy-MM-dd）
	 * 更新时间：2025-01-06
	 */
    public static int daysInMonth(String ymd) throws Exception{
        DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd"); //定义日期格式
        LocalDate specifiedDate=LocalDate.parse(ymd,fmt); //解析参数日期字符串为LocalDate对象
        
        YearMonth currentYearMonth=YearMonth.from(specifiedDate);
        int daysInMonth = currentYearMonth.lengthOfMonth();
        return daysInMonth;
    }

	/**
	 * 作用：获取当前日期是星期几
	 * 参数：字符串类型的年月日（格式为：yyyy-MM-dd）
	 * 更新时间：2025-01-06
	 */
    public static String dayOfWeek(String ymd) throws Exception{
        DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd"); //定义日期格式
        LocalDate specifiedDate=LocalDate.parse(ymd,fmt); //解析参数日期字符串为LocalDate对象
        
        DayOfWeek dayOfWeek=specifiedDate.getDayOfWeek();
        String rst=dayOfWeek.toString();
        if(rst.equals("MONDAY")){
        	rst="周一";
        }
        if(rst.equals("TUESDAY")){
        	rst="周二";
        }
        if(rst.equals("WEDNESDAY")){
        	rst="周三";
        }
        if(rst.equals("THURSDAY")){
        	rst="周四";
        }
        if(rst.equals("FRIDAY")){
        	rst="周五";
        }
        if(rst.equals("SATURDAY")){
        	rst="周六";
        }
        if(rst.equals("SUNDAY")){
        	rst="周日";
        }
        return rst;
    }

    /**
	 * 作用：a除以b（取a占b的比例），结果保留bit位小数
	 * 参数：double类型的a与b
	 * 更新时间：2024-12-25
	 */
    public static double getBili(double a,double b,int bit) {
        BigDecimal bdNumerator=BigDecimal.valueOf(a);
        BigDecimal bdDenominator=BigDecimal.valueOf(b);
        return bdNumerator.divide(bdDenominator,bit,RoundingMode.HALF_UP).doubleValue();
    }
    
    /**
	 * 作用：a除以b，结果保留2位小数
	 * 参数：double类型的a与int类型的b
	 * 更新时间：2025-01-09
	 */
    public static double aChuYib(double a, int b) {
        BigDecimal bdNumerator=BigDecimal.valueOf(a);
        BigDecimal bdDenominator=BigDecimal.valueOf(b);
        return bdNumerator.divide(bdDenominator,2,RoundingMode.HALF_UP).doubleValue();
    }
    
    /**
	 * 作用：double类型数字保留2位小数
	 * 参数：待处理的数:a
	 * 更新时间：2025-01-09
	 */
    public static double round(double a){
        //老算法
    	//long factor=(long)Math.pow(10, 2);
        //return Math.round(a*factor)/(double)factor;
    	
    	//新算法
    	BigDecimal bigDecimal=new BigDecimal(Double.toString(a));
        BigDecimal rounded=bigDecimal.setScale(2,RoundingMode.HALF_UP);
        return rounded.doubleValue();
    }

    public static void main(String[] args) throws Exception {
    	String ymd="2024-11-04";
    	double d=(1.6-1.5)/1.5*100;  //7.000000000000001
    	System.out.println("四舍五入后==" + Tools.round(d));
    	//String lastDay=Tools.lastDayOfMonth(ymd);
        //System.out.println("2024年10月的最后一天是：" + lastDay);
        //int daysInMonth=Tools.daysInMonth(ymd);
        //System.out.println("2024年10月的天数是：" + daysInMonth);
        //String t=Tools.dayOfWeek(ymd);
        //System.out.println(ymd+"是：" + t);
    }
}
